/**
 * IntervalTask class
 */
class IntervalTask {
    /**
     * constructor
     * @param {Object|String} options 
     */
    constructor(options) {
        this.options = this.parseOptions(options);
        this.global = {
            time: null,
            task: []
        };
        this.isRun = false;
    }
    /**
     * parse options
     * @param {Object|String} options 
     */
    parseOptions(options) {
        if (!Array.isArray(options)) {
            options = [options];
        }
        options = options.map(item => {
            item.global = typeof item.global == "boolean" ? item.global : true;
            if (!typeof item.handle == 'function') {
                const handle = item.handle;
                item.handle = () => handle(this);////
            }
            return item;
        })
        return options;
    }
    /**
     * run item task
     */
    runItemTask(item) {
        let now = (+new Date);
        if (item.global) {
            if (item.enable) {//是否启用
                if (now - item._last >= item.interval) {
                    item._last = now;
                    item.handle(item);
                }
            }
        } else {
            if (item.enable) {//是否启用
                item._last = now;
                item.handle(item);
            } else {
                clearInterval(item.ti);//停止
            }
        }
    }
    /**
     * run task
     */
    runTask() {
        if (this.isRun) return;
        let self = this;
        this.options.forEach((item, index) => {
            //任务名称
            item.taskName = `${item.name ? ', name:' + item.name : '_' + index}`;
            // 是否启动默认执行
            if (item.immediate) {
                item._last = 0;
                self.runItemTask(item);
            }
            // 间隔时间
            if (item.interval) {
                //是否使用全局
                if (item.global) {
                    item._last = (+new Date);
                    self.global.task.push(item);
                } else {
                    item.timer = setInterval(() => {
                        self.runItemTask(item);
                    }, item.interval);
                    item.taskName += `interval: ${item.interval}`;
                }
            } else {
                throw new Error('.interval or .cron need be set');
            }

        });
        this.global.time = setInterval(() => {
            self.global.task.forEach(item => {
                self.runItemTask(item);
            })
        }, 1);
        this.isRun = true;
    }
}

